package com.lsl.singleton_pattern.example.lazySingleton2;

/**
 * @author Zed
 * @description
 * @date 2022/12/14 22:29
 */
public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {
    }

    public static LazySingleton getInstance() {
        if (instance == null) {
            //我们无须对整个getInstance()方法进行锁定，只需对其中的代码"instance = new LazySingleton();"进行锁定即可
            synchronized (LazySingleton.class) {
                instance = new LazySingleton();
            }
        }
        return instance;
    }
//问题貌似得以解决，事实并非如此。如果使用以上代码来实现单例，还是会存在单例对象不唯一。原因如下：
//假如在某一瞬间线程A和线程B都在调用getInstance()方法，
//此时instance对象为null值，均能通过instance == null的判断。
//由于实现了synchronized加锁机制，线程A进入synchronized锁定的代码中执行实例创建代码，线程B处于排队等待状态，必须等待线程A执行完毕后才可以进入synchronized锁定代码。但当A执行完毕时，线程B并不知道实例已经创建，将继续创建新的实例，导致产生多个单例对象，违背单例模式的设计思想，
}